package org.jeecg.modules.system.util;

import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;
import java.util.concurrent.*;

@Component
public class ThreadPoolManager {

    // 核心线程数为1，最大线程数为10，当任务量超过核心线程数时，会动态地创建新线程，但最多不会超过最大线程数。
    //空闲线程的存活时间为60秒，超过这个时间会被回收。
    //使用了一个大小为20的LinkedBlockingQueue作为任务队列，当任务量超过核心线程数时，超出的任务会被放入这个队列中等待执行。
    //自定义了一个拒绝策略MyRejectedExecutionHandler，当任务无法被执行时，会重新执行被拒绝的任务。
    private final ExecutorService executor = new ThreadPoolExecutor(1, 10,
            60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(20),
            new MyRejectedExecutionHandler());

    // 自定义拒绝策略
    static class MyRejectedExecutionHandler implements RejectedExecutionHandler {
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            // 重新执行被拒绝的任务
            if (!executor.isShutdown()) {
                r.run();
            }
        }
    }

    public void executeTask(Runnable task) {
        executor.execute(task);
    }

    @PreDestroy
    public void shutdownThreadPool() {
        executor.shutdown();
    }

}
